/**
 * 颜色格式转换工具
 * @author zhangjianyong
 * @since 2024/12/19
 */

/**
 * 将RGB格式颜色转换为十六进制格式
 * @param rgb RGB格式颜色，如 "rgb(133, 47, 47)" 或 "rgba(133, 47, 47, 0.5)"
 * @returns 十六进制格式颜色，如 "#852F2F"
 */
export function rgbToHex(rgb: string): string {
  if (!rgb || typeof rgb !== 'string') {
    return ''
  }

  // 如果已经是十六进制格式，直接返回
  if (rgb.startsWith('#')) {
    return formatHexColor(rgb)
  }

  // 匹配 rgb() 或 rgba() 格式
  const rgbMatch = rgb.match(/rgba?\((\d+),\s*(\d+),\s*(\d+)(?:,\s*[\d.]+)?\)/)
  if (!rgbMatch) {
    return ''
  }

  const r = parseInt(rgbMatch[1], 10)
  const g = parseInt(rgbMatch[2], 10)
  const b = parseInt(rgbMatch[3], 10)

  // 转换为十六进制
  const toHex = (n: number) => {
    const hex = n.toString(16).toUpperCase()
    return hex.length === 1 ? '0' + hex : hex
  }

  return `#${toHex(r)}${toHex(g)}${toHex(b)}`
}

/**
 * 格式化十六进制颜色为标准格式 #FFFFFF
 * @param hex 十六进制颜色值
 * @returns 标准格式的十六进制颜色值
 */
export function formatHexColor(hex: string): string {
  if (!hex || typeof hex !== 'string') {
    return ''
  }

  hex = hex.trim().toUpperCase()

  // 移除开头的#号（如果有）
  if (hex.startsWith('#')) {
    hex = hex.substring(1)
  }

  // 验证格式并转换
  if (hex.match(/^[0-9A-F]{6}$/)) {
    // 已经是6位格式
    return '#' + hex
  } else if (hex.match(/^[0-9A-F]{3}$/)) {
    // 3位格式转换为6位格式 (FFF -> FFFFFF)
    return (
      '#' +
      hex
        .split('')
        .map(c => c + c)
        .join('')
    )
  }

  // 无效格式
  return ''
}

/**
 * 统一颜色格式为 #FFFFFF
 * 支持多种输入格式：rgb()、rgba()、#FFF、#FFFFFF等
 * @param color 任意格式的颜色值
 * @returns 标准格式的十六进制颜色值 #FFFFFF，无效输入返回空字符串
 */
export function normalizeColor(color: string): string {
  if (!color || typeof color !== 'string') {
    return ''
  }

  color = color.trim()

  // 处理 rgb() 或 rgba() 格式
  if (color.startsWith('rgb')) {
    return rgbToHex(color)
  }

  // 处理十六进制格式
  if (color.startsWith('#') || color.match(/^[0-9A-Fa-f]{3,6}$/)) {
    return formatHexColor(color)
  }

  // 无效格式
  return ''
}

/**
 * 验证颜色格式是否有效
 * @param color 颜色值
 * @returns 是否为有效颜色
 */
export function isValidColor(color: string): boolean {
  return normalizeColor(color) !== ''
}

/**
 * 生成随机颜色
 * @returns 随机的十六进制颜色值 #FFFFFF
 */
export function generateRandomColor(): string {
  const color = Math.floor(Math.random() * 0xffffff)
  return `#${color.toString(16).toUpperCase().padStart(6, '0')}`
}
